/*
 * Copyright 2025 The ChaosBlade Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package model

import "sync"

const (
	maxWorkers = 64 // magic number
)

type DoWorkFunc func(workID int)

func ParallelizeExec(workCount int, doWork DoWorkFunc) {
	workers := maxWorkers
	toExec := make(chan int, workCount)

	for i := 0; i < workCount; i++ {
		toExec <- i
	}
	close(toExec)

	if workCount < workers {
		workers = workCount
	}

	wg := sync.WaitGroup{}
	wg.Add(workers)
	for i := 0; i < workers; i++ {
		go func() {
			defer wg.Done()
			for workID := range toExec {
				doWork(workID)
			}
		}()
	}
	wg.Wait()
}
